package de.mnit.schnipsel;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;

import de.mnit.basis.daten.konstant.QUALITAET;
import de.mnit.basis.daten.konstant.position.POSITION_GERADE;
import de.mnit.basis.daten.konstant.position.POSITION_H;
import de.mnit.basis.daten.konstant.position.POSITION_V;
import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_InOut;
import de.mnit.basis.swt.anw.A_MN_Anw;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.SWT_Fenster;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.S_Fenster;
import de.mnit.basis.swt.layout.Ebene;
import de.mnit.basis.swt.layout.Layout2;
import de.mnit.basis.swt.layout.LayoutGitter;
import de.mnit.basis.swt.layout.LayoutLeer;
import de.mnit.basis.swt.layout.LayoutTrenner;
import de.mnit.basis.swt.spezial.suche.K_SucheFlach;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.Log;
import de.mnit.basis.sys.event.S_Extern;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.basis.sys.sprache.S;
import de.mnit.basis.sys.version.VERSIONSART;
import de.mnit.basis.sys.version.VersionsInfo;
import de.mnit.basis.sys.version.VersionsNummer;
import de.mnit.schnipsel.div.KonfigLokal;
import de.mnit.schnipsel.swt.HauptMenue;
import de.mnit.schnipsel.swt.K_Anzahl;
import de.mnit.schnipsel.swt.K_Anzeige;
import de.mnit.schnipsel.swt.K_Werkzeug;
import de.mnit.schnipsel.swt.baum.BAUMAKTION;
import de.mnit.schnipsel.swt.baum.K_Baum;
import de.mnit.schnipsel.swt.liste.K_Liste2;
import de.mnit.schnipsel.zentral.SC_Bilder;
import de.mnit.schnipsel.zentral.SC_DateiSys;
import de.mnit.schnipsel.zentral.SC_Events;
import de.mnit.schnipsel.zentral.SC_GuiObs;
import de.mnit.schnipsel.zentral.SC_SPRACHE;


/**
 * @author Michael Nitsche
 */
public class Anw_Schnipsel extends A_MN_Anw<Anw_Schnipsel> {

	public static final boolean		DEBUG_AUSGABE	= false;
	public static final boolean		DEBUG_DATEN		= false;
	public static final QUALITAET	STABILITAET	= QUALITAET.TEST;
	private static VersionsInfo version=null;


	public static void main(String[] par) {
		try {
			Log.neu(SC_DateiSys.gOrdnerLog(), !DEBUG_AUSGABE);
			QUALITAET.setze(STABILITAET);
			KonfigLokal.init("Schnipsel", SC_DateiSys.gDateiKonfig());
			Ausgabe.debug(SC_SPRACHE.gib(KonfigLokal.i().anwSprache()), SC_SPRACHE.gib(KonfigLokal.i().anwSprache()).locale);
			S.sprache(SC_SPRACHE.gib(KonfigLokal.i().anwSprache()).locale);
			VersionsNummer.setze(VersionsInfo.neu(0, 3, VERSIONSART.BETA, 6));
			version=VersionsNummer.gib();
		}
		catch(F_Sys_InOut e) {
			Fehler.zeig(e);
		}
		start(Anw_Schnipsel.class);
	}


	private final K_Werkzeug	k_leiste	= new K_Werkzeug();
	private final K_Liste2		k_liste		= new K_Liste2();
	private final K_SucheFlach	k_suche		= new K_SucheFlach();
	private final K_Anzeige		k_anzeige	= new K_Anzeige();
	private final K_Anzahl		k_anzahl	= new K_Anzahl();
	private final K_Baum		k_baum		= new K_Baum();
	private final HauptMenue	k_menue		= new HauptMenue();
	private LayoutTrenner ltBaum=null;
	private LayoutTrenner ltListe=null;
	public final Engpass<Integer> korr_breite= Engpass.neu(0);
	public final Engpass<Integer> korr_hoehe = Engpass.neu(0);


	public VersionsInfo gVersion() {
		return version;
	}

	// ERZEUGEN

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		SC_GuiObs.i().anwendung(this);
		SC_GuiObs.i().liste(t.k_liste);
		SC_GuiObs.i().anzahl(t.k_anzahl);
		SC_GuiObs.i().anzeige(t.k_anzeige);
		SC_GuiObs.i().baum(t.k_baum);
		SC_GuiObs.i().suche(t.k_suche);

		Ebene editor=Ebene.neu(this.k_anzeige).s1_Rahmen(true);
		Ebene baum=Ebene.neu(this.k_baum).s1_Rahmen(true);

		LayoutGitter werkzeug=LayoutGitter.neu()
			.sSpaltenAnzahl(4)
			.sZwischenraumH(5)
			.sKomponente(t.k_leiste)
				.sFlexibel()
				.fertig()
			.sKomponente(t.k_anzahl)
				.sBreite(150)
				.sPositionV(POSITION_V.MITTE)
				.sPositionH(POSITION_H.LINKS)
				.fertig()
			.sKomponente(LayoutLeer.neu())
				.sBreite(10)
			.sKomponente(t.k_suche)
				.sBreite(250)
//				.sFlexibelV()
				.sHoehe(24)
				.fertig();
		LayoutTrenner rechts=LayoutTrenner.neu(POSITION_GERADE.OBEN, 150, 100, t.k_liste, editor);
		this.ltListe=rechts;
		LayoutTrenner unten=LayoutTrenner.neu(POSITION_GERADE.LINKS, 200, 100, baum, rechts);
		this.ltBaum=unten;
		return Layout2.neu(werkzeug, POSITION_GERADE.OBEN, 32, unten);
	}

	protected void initStyle() {
		SC_GuiObs.i().hauptfenster(f());
		SC_Events.i();
		this.k_menue.init();
	}

	protected void initEvents() {
		this.ltBaum.ePosition(new S_Zuhoerer<Integer>() {
			public void verarbeite(Integer pos) {
				KonfigLokal.i().anwBaumBreite(pos);
			}
		});
		this.ltBaum.sPosition(KonfigLokal.i().anwBaumBreite());

		this.ltListe.ePosition(new S_Zuhoerer<Integer>() {
			public void verarbeite(Integer pos) {
				KonfigLokal.i().anwListenHoehe(pos);
			}
		});
		this.ltListe.sPosition(KonfigLokal.i().anwListenHoehe());

		t.k_anzeige.eGeaendert(new S_Zuhoerer<Object>(){
			public void verarbeite(Object o) {
				int id=t.k_anzeige.gID();
				t.k_liste.sNeueID(id);
				t.k_liste.aktualisieren(); //Setzt die angezeigte ID auf null!!!
//				t.k_liste.sAuswahl(id);
//				t.k_anzeige.sID(id);
			}
		});

		t.k_liste.eAuswahl(new S_Zuhoerer<Integer>(){
			public void verarbeite(Integer id) {
				SC_Events.zeigArtikel(id, false);
			}
		});

		t.k_suche.eSuche(new S_Zuhoerer<String>(){
			public void verarbeite(String suche) {
				Point p=t.k_suche.k_suche.swt().getSelection();
				t.k_baum.sAlle();
				t.k_liste.anzeigenSuche(suche);
				//Nicht schön, aber sonst erhält Titel sofort den Fokus!
				t.k_suche.sFokus();
				t.k_suche.k_suche.swt().setSelection(p);
			}
		});

		t.k_baum.eAuswahl(new S_Zuhoerer<Integer>() {
			public void verarbeite(Integer ast_id) {
				t.k_suche.sLeer();
				t.k_liste.anzeigenAst(ast_id);
			}
		});

		t.k_baum.eAktion(new S_Zuhoerer<BAUMAKTION>() {
			public void verarbeite(BAUMAKTION aktion) {
				t.k_suche.sLeer();
				if(aktion==BAUMAKTION.ALLE)  t.k_liste.anzeigenSuche("");
				if(aktion==BAUMAKTION.LOSE)  t.k_liste.anzeigenLose();
				if(aktion==BAUMAKTION.MUELL) t.k_liste.anzeigenMuell();
//				if(aktion==BAUMAKTION.SUCHE) {
//					t.k_liste.anzeigenSuche("");
//					t.k_suche.sFokus();
//				}
			}
		});

		/* Problem: Beim setzen von Fensterbreite 800 werden 831 gesetzt. Vmtl. Rahmen.
		 * Ich hab' keine Ahnung wo der Rand her kommt.
		 * Dies hier ist sicher nicht optimal, aber so funktionierts #0000269 */
		t.eBereit(new S_Zuhoerer<Object>() {
			public void verarbeite(Object o) {
				SC_Events.i().neuVerbinden();
				Rectangle r=f().swt().getBounds();
				korr_breite.s(r.width -KonfigLokal.i().anwBreite());
				korr_hoehe .s(r.height-KonfigLokal.i().anwHoehe());
				t.k_liste.spaltenAnpassen(); //BUGFIX Letzte Spalte der Tabelle wurde beim Start nicht korrigiert.
			}
		});

		t.eEndeSWT(new S_Extern<Object, Boolean>(){
			public Boolean verarbeite(Object o) {
				SC_Events.beenden(false);
				return true;
			}
		});
	}

	protected S_Fenster<?> hauptfenster(A_MN_Anw<?> instanz) {
		String titel="Schnipsel  "+(!DEBUG_AUSGABE ? version.zuTextKurz() : version+"")+"";
		return SWT_Fenster.neu(instanz, false, KonfigLokal.i().anwBreite(), KonfigLokal.i().anwHoehe(), titel,
				SC_Bilder.gIcon_16_MN,
				SC_Bilder.gIcon_24_MN,
				SC_Bilder.gIcon_32_MN,
				SC_Bilder.gIcon_64_MN
			);
	}

	protected void start(S_Fenster<?> fenster) {
		((SWT_Fenster)fenster).start();
	}

}
